﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace ProyectoFinal
{
    public partial class FormListado : Form
    {
        DataSet dsIsotopos;
        string rutaIsotoposSQL = "Data Source=localhost;Initial Catalog=Isotopos;Integrated Security=True";

        public FormListado()
        {
            InitializeComponent();
        }

        private void Form41_Load(object sender, EventArgs e)
        {
            string ConsultaSQLClientes = "Select * from Productos order by IdProducto";
            dsIsotopos = new DataSet();

            SqlConnection cn = new SqlConnection(rutaIsotoposSQL);
            SqlDataAdapter adaptador = new SqlDataAdapter(ConsultaSQLClientes, cn);
            cn.Open();
            adaptador.Fill(dsIsotopos, "Productos");

            dgvProductos.DataSource = dsIsotopos.Tables[0];
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnActualizar_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("¿Esta Seguro de querer guardar los cambios hechos? ¿Continuar?", "Confirmar Cambios.", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                ActualizarCambios(rutaIsotoposSQL, ref dsIsotopos);
            }                
        }

        private void ActualizarCambios(String RutaBD, ref DataSet ds)
        {
            DataSet dsActualizar;
            DataSet dsEliminar;
            DataSet dsAgregar;
            if (dsIsotopos.HasChanges(DataRowState.Modified))
            {
                dsActualizar = new DataSet();
                dsActualizar = dsIsotopos.GetChanges(DataRowState.Modified);
                ActualizarProductosEnBD(rutaIsotoposSQL, "Productos", dsActualizar);
            }
            if (dsIsotopos.HasChanges(DataRowState.Added))
            {
                dsAgregar = new DataSet();
                dsAgregar = dsIsotopos.GetChanges(DataRowState.Added);
                InsertarProductosEnBD(rutaIsotoposSQL, "Productos", dsAgregar);
            }
            if (dsIsotopos.HasChanges(DataRowState.Deleted))
            {
                dsEliminar = new DataSet();
                dsEliminar = dsIsotopos.GetChanges(DataRowState.Deleted);
                EliminarProductosEnBD(rutaIsotoposSQL, "Productos", dsEliminar);
            }
        }

        private void ArmarParametrosProductos(ref SqlCommand Comando, DataRow fila)
        {
            SqlParameter SqlParametros = new SqlParameter();
            SqlParametros = Comando.Parameters.Add("@IdProducto", SqlDbType.Int);
            SqlParametros.Value = fila["IdProducto"];
            SqlParametros = Comando.Parameters.Add("@NombreProducto", SqlDbType.NVarChar, 50);
            SqlParametros.Value = fila["NombreProducto"];
            SqlParametros = Comando.Parameters.Add("@IdProveedor", SqlDbType.Int);
            SqlParametros.Value = fila["IdProveedor"];
            SqlParametros = Comando.Parameters.Add("@IdCategoría", SqlDbType.Int);
            SqlParametros.Value = fila["IdCategoría"];
            SqlParametros = Comando.Parameters.Add("@CantidadPorUnidad", SqlDbType.NVarChar, 20);
            SqlParametros.Value = fila["CantidadPorUnidad"];
            SqlParametros = Comando.Parameters.Add("@PrecioUnidad", SqlDbType.Money);
            SqlParametros.Value = fila["PrecioUnidad"];
            SqlParametros = Comando.Parameters.Add("@UnidadesEnExistencia", SqlDbType.SmallInt);
            SqlParametros.Value = fila["UnidadesEnExistencia"];
            SqlParametros = Comando.Parameters.Add("@UnidadesEnPedido", SqlDbType.SmallInt);
            SqlParametros.Value = fila["UnidadesEnPedido"];
            SqlParametros = Comando.Parameters.Add("@NivelNuevoPedido", SqlDbType.Int);
            SqlParametros.Value = fila["NivelNuevoPedido"];
            SqlParametros = Comando.Parameters.Add("@Suspendido", SqlDbType.Bit);
            SqlParametros.Value = fila["Suspendido"];
            SqlParametros = Comando.Parameters.Add("@PrecioUnidad2", SqlDbType.Money);
            SqlParametros.Value = fila["PrecioUnidad2"];
            SqlParametros = Comando.Parameters.Add("@PrecioUnidadCompra", SqlDbType.Money);
            SqlParametros.Value = fila["PrecioUnidadCompra"];
        }

        private void ArmarParametrosProductosEliminar(ref SqlCommand Comando, DataRow fila)
        {
            SqlParameter SqlParametros = new SqlParameter();
            SqlParametros = Comando.Parameters.Add("@IdProducto", SqlDbType.Int);
            SqlParametros.Value = fila["IdProducto"];
        }

        private void ActualizarProductosEnBD(String RutaBD, String NombreTabla, DataSet ds)
        {
            int FilasActualizadas;
            foreach (DataRow fila in ds.Tables[NombreTabla].Rows)
            {
                SqlCommand Comando = new SqlCommand();
                ArmarParametrosProductos(ref Comando, fila);
                FilasActualizadas = EjecutarProductos(rutaIsotoposSQL, "ActualizarProducto", Comando);

                if (FilasActualizadas > 1)
                    MessageBox.Show("Se modificaron " + FilasActualizadas + " Productos");

                else
                    MessageBox.Show("Se modificó " + FilasActualizadas + " Producto");
            }
        }
        private int EjecutarProductos(String RutaBD, String NombreSP, SqlCommand Comando)
        {
            int FilasCambiadas;
            SqlConnection Conexion = new SqlConnection(RutaBD);
            Conexion.Open();
            SqlCommand cmd = new SqlCommand();
            cmd = Comando;
            cmd.Connection = Conexion;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = NombreSP;
            FilasCambiadas = cmd.ExecuteNonQuery();
            Conexion.Close();
            return FilasCambiadas;
        }
        private void InsertarProductosEnBD(String RutaBD, String NombreTabla, DataSet ds)
        {
            int FilasInsertadas;
            foreach (DataRow fila in ds.Tables[NombreTabla].Rows)
            {
                SqlCommand Comando = new SqlCommand();
                ArmarParametrosProductos(ref Comando, fila);
                FilasInsertadas = EjecutarProductos(rutaIsotoposSQL, "InsertarProducto", Comando);

                if (FilasInsertadas > 1)
                    MessageBox.Show("Se insertaron " + FilasInsertadas + " Productos");

                else
                    MessageBox.Show("Se insertó " + FilasInsertadas + " Producto");
            }
        }

        private void EliminarProductosEnBD(String RutaBD, String NombreTabla, DataSet ds)
        {
            int FilasEliminadas;
            foreach (DataRow fila in ds.Tables[NombreTabla].Rows)
            {
                SqlCommand Comando = new SqlCommand();
                fila.RejectChanges();
                ArmarParametrosProductosEliminar(ref Comando, fila);
                FilasEliminadas = EjecutarProductos(rutaIsotoposSQL, "EliminarProducto", Comando);

                if (FilasEliminadas > 1)
                    MessageBox.Show("Se eliminaron " + FilasEliminadas + " Productos");

                else
                    MessageBox.Show("Se eliminó " + FilasEliminadas + " Producto");
            }
        }

        private void dgvProductos_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }
    }
}
